﻿// OneScript: ./OInt/core/Modules/OPI_Bitrix24.os
// Lib: Bitrix24
// CLI: bitrix24

// MIT License

// Copyright (c) 2023 Anton Tsitavets

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:

// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.

// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.

// https://github.com/Bayselonarrend/OpenIntegrations

// BSLLS:Typo-off
// BSLLS:LatinAndCyrillicSymbolInWord-off
// BSLLS:IncorrectLineBreak-off

//@skip-check module-structure-top-region
//@skip-check module-structure-method-in-regions
//@skip-check wrong-string-literal-content
//@skip-check method-too-many-params

// Раскомментировать, если выполняется OneScript
#Использовать "../../tools"

#Область ПрограммныйИнтерфейс

#Область НастройкиИАдминистрирование

// Получить ссылку авторизации приложения
// Формирует ссылку для авторизации через браузер
// 
// Параметры:
//  Домен    - Строка - Адрес битрикс вида portal.bitrix24.com - domain
//  ClientID - Строка - Client ID из настроек приложения       - clientid
// 
// Возвращаемое значение:
//  Строка - URL для перехода в браузере
Функция ПолучитьСсылкуАвторизацииПриложения(Знач Домен, Знач ClientID) Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Домен);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(ClientID);
    
    Если Не СтрНачинаетсяС(Домен, "http") Тогда
        URL = "https://" + Домен;
    КонецЕсли;
    
    Если Не СтрЗаканчиваетсяНа(URL, "/") Тогда
        URL = URL + "/";
    КонецЕсли;
    
    URL = URL + "oauth/authorize/?client_id=" + ClientID;
    
    Возврат URL;
        
КонецФункции

// Получить токен
// Получает токен по коду авторизации
// 
// Параметры:
//  ClientID     - Строка - Client ID из настроек приложения       - clientid
//  ClientSecret - Строка - Client secret из настроек приложения   - clientsecret
//  Code         - Строка - Code из авторизации через браузер      - code
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьТокен(Знач ClientID, Знач ClientSecret, Знач Code) Экспорт
    
    URL = "https://oauth.bitrix.info/oauth/token/";
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("grant_type"   , "authorization_code", "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("client_id"    , ClientID            , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("client_secret", ClientSecret        , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("code"         , Code                , "Строка", Параметры);  
    
    Ответ = OPI_Инструменты.Get(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Обновить токен
// Обновляет токен по Refresh токену
// 
// Параметры:
//  ClientID     - Строка - Client ID из настроек приложения      - clientid
//  ClientSecret - Строка - Client secret из настроек приложения  - clientsecret
//  Refresh      - Строка - Refresh токен                         - refresh
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ОбновитьТокен(Знач ClientID, Знач ClientSecret, Знач Refresh) Экспорт
    
    URL = "https://oauth.bitrix.info/oauth/token/";
    
    Параметры = Новый Структура;
    OPI_Инструменты.ДобавитьПоле("grant_type"   , "refresh_token"     , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("client_id"    , ClientID            , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("client_secret", ClientSecret        , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("refresh_token", Refresh             , "Строка", Параметры);  
    
    Ответ = OPI_Инструменты.Get(URL, Параметры);
    
    Возврат Ответ;

Конецфункции

// Серверное время
// Получает текущее серверное время
// 
// Параметры:
//  URL   - Строка - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url
//  Токен - Строка - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция СерверноеВремя(Знач URL, Знач Токен = "") Экспорт
	
	Параметры = НормализоватьАвторизацию(URL, Токен, "server.time");
	Ответ     = OPI_Инструменты.Get(URL, Параметры);
	
	Возврат Ответ;
		
КонецФункции

#КонецОбласти

#Область РаботаСЖивойЛентой

// Создать новость
// Создает новую новость в ленте
// 
// Параметры:
//  URL       - Строка - URL внешнего вебхука или адрес Bitrix24 при использовании токена                    - url
//  Текст     - Строка - Текст новости                                                                       - text
//  Видимость - Строка - Массив или 1 получатель: UA все, SGn р. группа, Un пользователь, DRn отдел, Gn группа - vision
//  Файлы     - Строка - Данные вложений, где ключ > имя файла, значение > путь к файлу иди двоичные данные  - files
//  Заголовок - Строка - Заголовок новости                                                                   - title
//  Важное    - Булево - Помечает новость как важную                                                         - important 
//  Токен     - Строка - Токен авторизации, если используется не вебхук                                      - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция СоздатьНовость(Знач URL
	, Знач Текст
	, Знач Видимость = "UA"
	, Знач Файлы = ""
	, Знач Заголовок = ""
	, Знач Важное = Ложь
	, Знач Токен = "") Экспорт
    
    ПривестиБулево(Важное);
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "log.blogpost.add");
    OPI_Инструменты.ДобавитьПоле("POST_MESSAGE", Текст     , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("POST_TITLE"  , Заголовок , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("DEST"        , Видимость , "Массив", Параметры);
    OPI_Инструменты.ДобавитьПоле("IMPORTANT"   , Важное    , "Строка", Параметры);
    
    Если ЗначениеЗаполнено(Файлы) Тогда
        
        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Файлы);
        
        МассивФайлов = НормализоватьФайлы(Файлы);
        
        Если Не МассивФайлов.Количество() = 0 Тогда
            Параметры.Вставить("FILES", МассивФайлов);
        КонецЕсли;
        
    Конецесли;
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Изменить новость
// Изменяет новость в ленте
// 
// Параметры:
//  URL       - Строка - URL внешнего вебхука или адрес Bitrix24 при использовании токена                    - url
//  IDНовости - Строка, Число - ID новости                                                                   - postid
//  Текст     - Строка - Текст новости                                                                       - text
//  Видимость - Строка - Массив или 1 получатель: UA все, SGn р. группа, Un пользователь, DRn отдел, Gn группа - vision
//  Файлы     - Строка - Данные вложений, где ключ > имя файла, значение > путь к файлу иди двоичные данные  - files
//  Заголовок - Строка - Заголовок новости                                                                   - title
//  Токен     - Строка - Токен авторизации, если используется не вебхук                                      - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ИзменитьНовость(Знач URL
    , Знач IDНовости 
    , Знач Текст
    , Знач Видимость = "UA"
    , Знач Файлы = ""
    , Знач Заголовок = ""
    , Знач Токен = "") Экспорт
        
    Параметры = НормализоватьАвторизацию(URL, Токен, "log.blogpost.update");
    OPI_Инструменты.ДобавитьПоле("POST_MESSAGE", Текст     , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("POST_TITLE"  , Заголовок , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("DEST"        , Видимость , "Массив", Параметры);
    OPI_Инструменты.ДобавитьПоле("POST_ID"     , IDНовости , "Строка", Параметры);
    
    Если ЗначениеЗаполнено(Файлы) Тогда
        
        OPI_ПреобразованиеТипов.ПолучитьКоллекцию(Файлы);
        
        МассивФайлов = НормализоватьФайлы(Файлы);
        
        Если Не МассивФайлов.Количество() = 0 Тогда
            Параметры.Вставить("FILES", МассивФайлов);
        КонецЕсли;
        
    Конецесли;
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Удалить новость
// Удаляет новость из ленты по выбранному ID
// 
// Параметры:
//  URL       - Строка        - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url 
//  IDНовости - Строка, Число - ID новости для удаления                                          - postid
//  Токен     - Строка        - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция УдалитьНовость(Знач URL, Знач IDНовости, Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "log.blogpost.delete");
    OPI_Инструменты.ДобавитьПоле("POST_ID", IDНовости, "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Получить список просмотревших важное
// Возвращает список пользователей, просмотревших выбранное важное сообщение
// 
// Параметры:
//  URL       - Строка        - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url 
//  IDНовости - Строка, Число - ID важной новости                                                - postid
//  Токен     - Строка        - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьСписокПросмотревшихВажное(Знач URL, Знач IDНовости, Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "log.blogpost.getusers.important");
    OPI_Инструменты.ДобавитьПоле("POST_ID", IDНовости, "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Получить новости
// Получает нвости или одну новость с отобором по ID или доступности
// 
// Параметры:
//  URL       - Строка        - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url 
//  IDНовости - Строка, Число - ID важной новости                                                - postid
//  Отбор - Строка - Отбор новостей по доступу: UA все, SGn раб. группа, Un пользователь, DRn отдел, Gn группа - sel 
//  Токен     - Строка        - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьНовости(Знач URL, Знач IDНовости = "", Знач Отбор = "UA", Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "log.blogpost.get");
    
    OPI_Инструменты.ДобавитьПоле("POST_ID"   , IDНовости, "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("LOG_RIGHTS", Отбор    , "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Добавить комментарий
// Добавляет комментарий к новости
// 
// Параметры:
//  URL       - Строка        - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url 
//  IDНовости - Строка, Число - ID новости                                                       - postid
//  Текст     - Строка        - Текст комментария                                                - text
//  Токен     - Строка        - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ДобавитьКомментарий(Знач URL, Знач IDНовости, Знач Текст, Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "log.blogcomment.add");
    
    OPI_Инструменты.ДобавитьПоле("POST_ID"   , IDНовости, "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("TEXT"      , Текст    , "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Добавить получателей к новости
// Добавляет новые группы или пользователей в получатели
// 
// Параметры:
//  URL       - Строка - URL внешнего вебхука или адрес Bitrix24 при использовании токена                       - url
//  IDНовости - Строка, Число - ID новости                                                                      - postid
//  Видимость - Строка - Массив или 1 получатель: UA все, SGn р. группа, Un пользователь, DRn отдел, Gn группа - vision
//  Токен     - Строка - Токен авторизации, если используется не вебхук                                         - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ДобавитьПолучателейКНовости(Знач URL, Знач IDНовости, Знач Видимость, Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "log.blogpost.share");
    
    OPI_Инструменты.ДобавитьПоле("POST_ID"   , IDНовости, "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("DEST"      , Видимость, "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

#КонецОбласти

#Область РаботаСЗадачами

// Получить структуру задачи
// Получает структуру с описанем полей для создания задачи
// 
// Параметры:
//  URL       - Строка - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url
//  Токен     - Строка - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьСтруктуруЗадачи(Знач URL, Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "tasks.task.getFields");
    Ответ = OPI_Инструменты.Get(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции    

// Получить задачу
// Получает задачу по ID
// 
// Параметры:
//  URL       - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url
//  IDЗадачи  - Число,Строка - ID задачи                                                        - task
//  Токен     - Строка       - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьЗадачу(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.get", Токен);
    Возврат Ответ;
    
КонецФункции

// Получить список задач
// Получает список задач (50 шт. за запрос максимум) с фильтром или без (см. ПолучитьСтруктуруФильтраЗадач)
// 
// Параметры:
//  URL      - Строка                     - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url
//  Фильтр   - Структура из КлючИЗначение - Структура отбора задач (см. ПолучитьСтруктуруФильтраЗадач)       - filter
//  Отступ   - Число, Строка              - Отступ от начала списка для полчения задач > 50 шт. рекурсивно   - offset
//  Токен    - Строка                     - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьСписокЗадач(Знач URL, Знач Фильтр = "", Знач Отступ = 0, Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "tasks.task.list");
    OPI_Инструменты.ДобавитьПоле("filter", Фильтр, "Коллекция", Параметры);
    OPI_Инструменты.ДобавитьПоле("start" , Отступ, "Строка"   , Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Создать задачу
// Создает новую задачу по структуре полей (см. ПолучитьСтруктуруЗадачи)
// 
// Параметры:
//  URL            - Строка - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  СтруктураПолей - Структура Из КлючИЗначение - Структура полей задачи                         - fields
//  Токен          - Строка                     - Токен авторизации, если используется не вебхук - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция СоздатьЗадачу(Знач URL, Знач СтруктураПолей, Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "tasks.task.add");
    OPI_Инструменты.ДобавитьПоле("fields", СтруктураПолей, "Коллекция", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;

КонецФункции

// Изменить задачу
// Изменяет существующую задачу
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  СтруктураПолей - Структура Из КлючИЗначение - Структура полей задачи                               - fields
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ИзменитьЗадачу(Знач URL, Знач IDЗадачи, Знач СтруктураПолей, Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "tasks.task.update");
    OPI_Инструменты.ДобавитьПоле("fields", СтруктураПолей, "Коллекция", Параметры);
    OPI_Инструменты.ДобавитьПоле("taskId", IDЗадачи      , "Строка"   , Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;

КонецФункции

// Удалить задачу
// Удаляет задачу по ID
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция УдалитьЗадачу(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.delete", Токен);
    Возврат Ответ;
    
КонецФункции

// Принять задачу
// Принимает задачу по ID
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПринятьЗадачу(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.approve", Токен);
    Возврат Ответ;
    
КонецФункции

// Отклонить задачу
// Отклоняет задачу по ID
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ОтклонитьЗадачу(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.disapprove", Токен);
    Возврат Ответ;
    
КонецФункции

// Завершить задачу
// Завершает задачу по ID
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ЗавершитьЗадачу(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.complete", Токен);
    Возврат Ответ;
    
КонецФункции

// Возобновить задачу
// Возвращает в работу задачу по ID
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ВозобновитьЗадачу(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.renew", Токен);
    Возврат Ответ;
    
КонецФункции

// Отложить задачу
// Откладывает задачу по ID
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ОтложитьЗадачу(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.defer", Токен);
    Возврат Ответ;
    
КонецФункции

// Приостановить задачу
// Приостанавливает задачу по ID
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПриостановитьЗадачу(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.pause", Токен);
    Возврат Ответ;
    
КонецФункции

// Начать выполнение задачи
// Начинает выполнение задачи по ID
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция НачатьВыполнениеЗадачи(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.start", Токен);
    Возврат Ответ;
    
КонецФункции

// Начать наблюдать за задачей
// Начинает наблюдение за задачей по ID
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция НачатьНаблюдатьЗаЗадачей(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.startwatch", Токен);
    Возврат Ответ;
    
КонецФункции

// Прекратить наблюдать за задачей
// Прекращает наблюдение за задчей по ID
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПрекратитьНаблюдатьЗаЗадачей(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.stopwatch", Токен);
    Возврат Ответ;
    
КонецФункции

// Делегировать задачу
// Делегирует задачу на другого пользователя
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  IDПользователя - Число,Строка - ID пользователя исполнителя                                        - user
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ДелегироватьЗадачу(Знач URL, Знач IDЗадачи, Знач IDПользователя, Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "tasks.task.delegate");
    OPI_Инструменты.ДобавитьПоле("taskId", IDЗадачи      , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("userId", IDПользователя, "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Добавить задачу в избранное
// Добавляет задачу в список избранного
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ДобавитьЗадачуВИзбранное(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.favorite.add", Токен);
    Возврат Ответ;
    
КонецФункции

// Убрать задачу из избранного
// Удаляет задачу из списка избранного
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция УбратьЗадачуИзИзбранного(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.favorite.remove", Токен);
    Возврат Ответ;
    
КонецФункции

// Получить историю задачи
// Получает историю изменений задачи
// 
// Параметры:
//  URL            - Строка       - URL внешнего вебхука или адрес Bitrix24 при использовании токена   - url
//  IDЗадачи       - Число,Строка - ID задачи                                                          - task
//  Токен          - Строка       - Токен авторизации, если используется не вебхук                     - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьИсториюЗадачи(Знач URL, Знач IDЗадачи, Знач Токен = "") Экспорт
    
    Ответ = УправлениеЗадачей(URL, IDЗадачи, "tasks.task.history.list", Токен);
    Возврат Ответ;
    
КонецФункции

// Получить список комментариев задачи
// Полчает список комментариев пользователей к задаче по ID
// 
// Параметры:
//  URL       - Строка                     - URL внешнего вебхука или адрес Bitrix24 при использовании токена  - url
//  IDЗадачи  - Число,Строка               - ID задачи                                                         - task
//  Фильтр    - Структура из КлючИЗначение - Структура отбора (см. ПолучитьСтруктуруФильтраКомментариев)       - filter
//  Токен     - Строка                     - Токен авторизации, если используется не вебхук                    - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьСписокКомментариевЗадачи(Знач URL, Знач IDЗадачи, Знач Фильтр = "", Знач Токен = "") Экспорт

    Параметры = НормализоватьАвторизацию(URL, Токен, "tasks.task.delegate");
    OPI_Инструменты.ДобавитьПоле("TASKID", IDЗадачи, "Строка"   , Параметры);
    OPI_Инструменты.ДобавитьПоле("FILTER", Фильтр  , "Коллекция", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Получить структуру фильтра задач
// Возвращает структуру полей для фильтрации задач в методе ПолучитьСписокЗадач
// 
// Параметры:
//  Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
// 
// Возвращаемое значение:
//  Структура Из КлючИЗначение - Структура полей 
Функция ПолучитьСтруктуруФильтраЗадач(Знач Пустая = Ложь) Экспорт
    
    // Подробнее
    // https://dev.1c-bitrix.ru/rest_help/tasks/task/tasks/tasks_task_list.php
    
    OPI_ПреобразованиеТипов.ПолучитьБулево(Пустая);
    
    СтруктураФильтра = Новый Структура;
    СтруктураФильтра.Вставить("ID"               , "<идентификатор задачи>");
    СтруктураФильтра.Вставить("PARENT_ID"        , "<идентификатор родительской задачи>");
    СтруктураФильтра.Вставить("GROUP_ID"         , "<идентификатор рабочей группы>");
    СтруктураФильтра.Вставить("CREATED_BY"       , "<постановщик>");
    СтруктураФильтра.Вставить("STATUS_CHANGED_BY", "<пользователь, последним изменивший статус задачи>");
    СтруктураФильтра.Вставить("PRIORITY"         , "<приоритет>");
    СтруктураФильтра.Вставить("FORUM_TOPIC_ID"   , "<идентификатор темы форума>");
    СтруктураФильтра.Вставить("RESPONSIBLE_ID"   , "<исполнитель>");
    СтруктураФильтра.Вставить("TITLE"            , "<название задачи (можно искать по шаблону [%_])>");
    СтруктураФильтра.Вставить("TAG"              , "<тэг>");
    СтруктураФильтра.Вставить("REAL_STATUS"      , "<статус задачи>");
    СтруктураФильтра.Вставить("MARK"             , "<оценка>");
    СтруктураФильтра.Вставить("SITE_ID"          , "<идентификатор сайта>");
    СтруктураФильтра.Вставить("ADD_IN_REPORT"    , "<задача в отчете (Y|N)>");
    СтруктураФильтра.Вставить("DATE_START"       , "<дата начала выполнения>");
    СтруктураФильтра.Вставить("DEADLINE"         , "<крайний срок>");
    СтруктураФильтра.Вставить("CREATED_DATE"     , "<дата создания>");
    СтруктураФильтра.Вставить("CLOSED_DATE"      , "<дата завершения>");
    СтруктураФильтра.Вставить("CHANGED_DATE"     , "<дата последнего изменения>");
    СтруктураФильтра.Вставить("ACCOMPLICE"       , "<идентификатор соисполнителя>");
    СтруктураФильтра.Вставить("AUDITOR"          , "<идентификатор наблюдателя>");
    СтруктураФильтра.Вставить("DEPENDS_ON"       , "<идентификатор предыдущей задачи>");
    СтруктураФильтра.Вставить("ONLY_ROOT_TASKS"  , "<только задачи, которые не являются подзадачами (Y|N)>");
    СтруктураФильтра.Вставить("STAGE_ID"         , "<стадия>");
    СтруктураФильтра.Вставить("UF_CRM_TASK"      , "<элементы CRM>");
    СтруктураФильтра.Вставить("STATUS"
        , "<статус для сортировки. Аналогичен REAL_STATUS, но имеет дополнительно три мета-статуса>");
        
    Если Пустая Тогда
    	Для Каждого Фильтр Из СтруктураФильтра Цикл
    		Фильтр.Значение = "";
    	КонецЦикла;
    КонецЕсли;

    //@skip-check constructor-function-return-section
    Возврат СтруктураФильтра;
        
КонецФункции

// Получить структуру фильтра комментариев
// Возвращает структуру полей для фильтрации комментариев в методе ПолучитьСписокКомментариевЗадачи
// 
// Параметры:
//  Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания полей - empty
//  
// Возвращаемое значение:
//  Структура Из КлючИЗначение - Структура полей 
Функция ПолучитьСтруктуруФильтраКомментариев(Знач Пустая = Ложь) Экспорт
	
	// Подробнее
	// https://dev.1c-bitrix.ru/rest_help/tasks/task/commentitem/getlist.php
	
	OPI_ПреобразованиеТипов.ПолучитьБулево(Пустая);
	
	СтруктураФильтра = Новый Структура;
	СтруктураФильтра.Вставить("ID"          , "<идентификатор комментария>");
	СтруктураФильтра.Вставить("AUTHOR_ID "  , "<идентификатор автора комментария>");
	СтруктураФильтра.Вставить("AUTHOR_NAME ", "<имя автора>");
	СтруктураФильтра.Вставить("POST_DATE "  , "<дата публикации комментария>");
	
	Если Пустая Тогда
    	Для Каждого Фильтр Из СтруктураФильтра Цикл
    		Фильтр.Значение = "";
    	КонецЦикла;
	КонецЕсли;
	    
    //@skip-check constructor-function-return-section
	Возврат СтруктураФильтра;
	
КонецФункции

#КонецОбласти

#Область РаботаСДискомИФайлами

// Получить список хранилищ
// Получает список доступных хранилищ файлов
// 
// Параметры:
//  URL       - Строка  - URL внешнего вебхука или адрес Bitrix24 при использовании токена  - url
//  Токен     - Строка  - Токен авторизации, если используется не вебхук                    - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьСписокХранилищ(Знач URL, Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "disk.storage.getlist");
    Ответ     = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;

КонецФункции

// Получить хранилище приложения
// Получает информацию о хранилище с которым может работать приложение для хранения своих данных
// 
// Параметры:
//  URL       - Строка  - URL внешнего вебхука или адрес Bitrix24 при использовании токена  - url
//  Токен     - Строка  - Токен авторизации, если используется не вебхук                    - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьХранилищеПриложения(Знач URL, Знач Токен = "") Экспорт
	
	Параметры = НормализоватьАвторизацию(URL, Токен, "disk.storage.getforapp");
    Ответ     = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Получить хранилище
// Получает информацию о хранилище по ID
// 
// Параметры:
//  URL          - Строка           - URL внешнего вебхука или адрес Bitrix24 при использовании токена  - url
//  IDХранилища  - Строка, Число    - Идентификатор хранилища                                           - storageid
//  Токен        - Строка           - Токен авторизации, если используется не вебхук                    - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьХранилище(Знач URL, Знач IDХранилища, Знач Токен = "") Экспорт
	
	Ответ = УправлениеФайлом(URL, IDХранилища, "disk.storage.get", Токен);
	Возврат Ответ;
	
КонецФункции

// Переименовать хранилище
// Изменяет имя хранилища (только для хранилища приложения см. ПолучитьСписокХранилищПриложения)
// 
// Параметры:
//  URL          - Строка           - URL внешнего вебхука или адрес Bitrix24 при использовании токена  - url
//  IDХранилища  - Строка, Число    - Идентификатор хранилища                                           - storageid
//  Наименование - Строка           - Новое наименование хранилища                                      - title
//  Токен        - Строка           - Токен авторизации, если используется не вебхук                    - token
// 
// Возвращаемое значение:
//  HTTPОтвет -  Переименовать хранилище
Функция ПереименоватьХранилище(Знач URL, Знач IDХранилища, Знач Наименование, Знач Токен = "") Экспорт
	
	Параметры = НормализоватьАвторизацию(URL, Токен, "disk.storage.rename");
	
    OPI_Инструменты.ДобавитьПоле("id"     , IDХранилища , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("newName", Наименование, "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Получить содержимое хранилища
// Получает список файлов и каталогов, находящихся в корне хранилища
// 
// Параметры:
//  URL          - Строка           - URL внешнего вебхука или адрес Bitrix24 при использовании токена  - url
//  IDХранилища  - Строка, Число    - Идентификатор хранилища                                           - storageid
//  Токен        - Строка           - Токен авторизации, если используется не вебхук                    - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьСодержимоеХранилища(Знач URL, Знач IDХранилища, Знач Токен = "") Экспорт
	
	Ответ = УправлениеФайлом(URL, IDХранилища, "disk.storage.getchildren", Токен);
	Возврат Ответ;
	
КонецФункции

// Загрузить файл в хранилище
// Загружает файл в выбранное хранилище
// 
// Параметры:
//  URL          - Строка                 - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url
//  Наименование - Строка                 - Наименование файла с расширением для сохранения                  - title
//  Файл         - Строка, ДвоичныеДанные - Файл для загрузки                                                - file        
//  IDХранилища  - Строка                 - Идентификатор хранилища для загрузки                             - storageid
//  Доступы      - Строка                 - Массив доступов по задачам, если необходимо                      - rights
//  Токен        - Строка                 - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ЗагрузитьФайлВХранилище(Знач URL
    , Знач Наименование
    , Знач Файл
    , Знач IDХранилища
    , Знач Доступы = ""
    , Знач Токен = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(IDХранилища);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
    
    Метод = "disk.storage.uploadfile";

    ДанныеФайла     = Новый Структура("NAME", Наименование);
    СодержимоеФайла = Новый Соответствие();
    СодержимоеФайла.Вставить(Наименование, Файл);
    
    Параметры = НормализоватьАвторизацию(URL, Токен, Метод);
    OPI_Инструменты.ДобавитьПоле("data"  , ДанныеФайла, "Коллекция", Параметры);
    OPI_Инструменты.ДобавитьПоле("rights", Доступы    , "Массив"   , Параметры);
    OPI_Инструменты.ДобавитьПоле("id"    , IDХранилища, "Строка"   , Параметры);

    МассивФайла = НормализоватьФайлы(СодержимоеФайла);
    
    Если Не МассивФайла.Количество() = 0 Тогда
        Параметры.Вставить("fileContent", МассивФайла[0]);
    КонецЕсли;
  
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Создать каталог в хранилище
// Создает пустой каталог в хранилище
// 
// Параметры:
//  URL          - Строка - URL внешнего вебхука или адрес Bitrix24 при использовании токена  - url
//  IDХранилища  - Строка - Идентификатор хранилища                                           - storageid
//  Наименование - Строка - Имя каталога                                                      - title
//  Токен        - Строка - Токен авторизации, если используется не вебхук                    - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция СоздатьКаталогВХранилище(Знач URL, Знач IDХранилища, Знач Наименование, Знач Токен = "") Экспорт
	
	OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
	
	СтруктураПапки = Новый Структура("NAME", Наименование);
	
	Параметры = НормализоватьАвторизацию(URL, Токен, "disk.storage.addfolder");
	
    OPI_Инструменты.ДобавитьПоле("id"  , IDХранилища   , "Строка"   , Параметры);
    OPI_Инструменты.ДобавитьПоле("data", СтруктураПапки, "Коллекция", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;	
    
КонецФункции

// Получить каталог
// Получает информацию о каталоге
// 
// Параметры:
//  URL          - Строка           - URL внешнего вебхука или адрес Bitrix24 при использовании токена  - url
//  IDКаталога   - Строка, Число    - Идентификатор каталога                                            - folderid
//  Токен        - Строка           - Токен авторизации, если используется не вебхук                    - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьКаталог(Знач URL, Знач IDКаталога, Знач Токен = "") Экспорт
    
    Ответ = УправлениеФайлом(URL, IDКаталога, "disk.folder.get", Токен);
    Возврат Ответ;
    
КонецФункции

// Создать подкаталог
// Создает каталог внутри другого каталога
// 
// Параметры:
//  URL          - Строка           - URL внешнего вебхука или адрес Bitrix24 при использовании токена  - url
//  IDКаталога   - Строка, Число    - Идентификатор каталога родителя                                   - folderid
//  Наименование - Строка           - Наименование нового каталога                                      - title
//  Токен        - Строка           - Токен авторизации, если используется не вебхук                    - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция СоздатьПодкаталог(Знач URL, Знач IDКаталога, Знач Наименование, Знач Токен = "") Экспорт
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Наименование);
    
    СтруктураПапки = Новый Структура("NAME", Наименование);
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "disk.folder.addsubfolder");
    
    OPI_Инструменты.ДобавитьПоле("id"  , IDКаталога    , "Строка"   , Параметры);
    OPI_Инструменты.ДобавитьПоле("data", СтруктураПапки, "Коллекция", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;  
    
КонецФункции

// Копировать каталог
// Копирует один каталог в другой
// 
// Параметры:
//  URL          - Строка           - URL внешнего вебхука или адрес Bitrix24 при использовании токена  - url
//  IDКаталога   - Строка, Число    - Идентификатор каталога родителя                                   - folderid
//  IDПриемника  - Строка, Число    - ID каталога назначения                                            - tagetid
//  Токен        - Строка           - Токен авторизации, если используется не вебхук                    - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция КопироватьКаталог(Знач URL, Знач IDКаталога, Знач IDПриемника, Знач Токен = "") Экспорт
    
    Параметры = НормализоватьАвторизацию(URL, Токен, "disk.folder.copyto");
    
    OPI_Инструменты.ДобавитьПоле("id"            , IDКаталога , "Строка", Параметры);
    OPI_Инструменты.ДобавитьПоле("targetFolderId", IDПриемника, "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ; 
    
КонецФункции

// Удалить файл
// Удаляет файл по ID
// 
// Параметры:
//  URL          - Строка                 - URL внешнего вебхука или адрес Bitrix24 при использовании токена  - url
//  IDФайла      - Строка, Число          - Идентификатор удаляемого файла                                    - fileid
//  Токен        - Строка                 - Токен авторизации, если используется не вебхук                    - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция УдалитьФайл(Знач URL, Знач IDФайла, Знач Токен = "") Экспорт
    
	Ответ = УправлениеФайлом(URL, IDФайла, "disk.file.delete", Токен);
	Возврат Ответ;

КонецФункции

// Удалить каталог
// Удаляет каталог с подкаталогами
// 
// Параметры:
//  URL          - Строка                 - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url
//  IDКаталога   - Строка, Число          - Идентификатор удаляемого каталога                                - folderid
//  Токен        - Строка                 - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция УдалитьКаталог(Знач URL, Знач IDКаталога, Знач Токен = "") Экспорт
	
	Ответ = УправлениеФайлом(URL, IDКаталога, "disk.folder.deletetree", Токен);
	Возврат Ответ;
	
КонецФункции

// Получить внешнюю ссылку каталога
// Получает внешнюю ссылку для доступа к каталогу
// 
// Параметры:
//  URL          - Строка                 - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url
//  IDКаталога   - Строка, Число          - Идентификатор каталога                                           - folderid
//  Токен        - Строка                 - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьВнешнююСсылкуКаталога(Знач URL, Знач IDКаталога, Знач Токен = "") Экспорт
	
	Ответ = УправлениеФайлом(URL, IDКаталога, "disk.folder.getExternalLink", Токен);
	Возврат Ответ;
	
КонецФункции

// Получить дочерние элементы каталога
// Получает дочерние элементы каталога
// 
// Параметры:
//  URL        - Строка                     - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url
//  IDКаталога - Строка, Число              - Идентификатор каталога                                         - folderid
//  Фильтр     - Структура из КлючИЗначение - Отбор элементов (См. ПолучитьСтруктуруФильтраКаталога)         - filter
//  Токен      - Строка                     - Токен авторизации, если используется не вебхук                 - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПолучитьДочерниеЭлементыКаталога(Знач URL, Знач IDКаталога, Знач Фильтр = "", Знач Токен = "") Экспорт
	
	Параметры = НормализоватьАвторизацию(URL, Токен, "disk.folder.getchildren");
	OPI_Инструменты.ДобавитьПоле("id"    , IDКаталога, "Строка"   , Параметры);
    OPI_Инструменты.ДобавитьПоле("filter", Фильтр    , "Коллекция", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

// Поместить каталог в корзину
// Перемещает каталог в корзину удаляемых файлов
// 
// Параметры:
//  URL          - Строка                 - URL внешнего вебхука или адрес Bitrix24 при использовании токена - url
//  IDКаталога   - Строка, Число          - Идентификатор каталога                                           - folderid
//  Токен        - Строка                 - Токен авторизации, если используется не вебхук                   - token
// 
// Возвращаемое значение:
//  Соответствие Из КлючИЗначение - сериализованный JSON ответа от Bitrxi24
Функция ПоместитьКаталогВКорзину(Знач URL, Знач IDКаталога, Знач Токен = "") Экспорт
	
    Ответ = УправлениеФайлом(URL, IDКаталога, "disk.folder.markdeleted", Токен);
	Возврат Ответ;
	
КонецФункции

// Получить структуру фильтра каталога
// Возвращает структуру полей для фильтрации дочерних элементов каталога
// 
// Параметры:
//  URL    - Строка - URL внешнего вебхука или адрес Bitrix24 при использовании токена                       - url
//  Пустая - Булево - Истина > структура с пустыми значениями, Ложь > в значениях будут описания типов полей - empty
//  Токен  - Строка - Токен авторизации, если используется не вебхук                                         - token
// 
// Возвращаемое значение:
//  Структура Из КлючИЗначение - Структура полей 
Функция ПолучитьСтруктуруФильтраКаталога(Знач URL, Знач Пустая = Ложь, Знач Токен = "") Экспорт
	
	Параметры = НормализоватьАвторизацию(URL, Токен, "disk.folder.getfields");
	Фильтр    = Новый Структура;
	
	Ответ = OPI_Инструменты.Post(URL, Параметры);
	Поля  = Ответ["result"];
	
	Для Каждого Поле Из Поля Цикл
		
		Имя       = Поле.Ключ;
		Описание  = Поле.Значение;
		
		Если Описание["USE_IN_FILTER"] Тогда
		
			ТипДанных = ?(Пустая, "", Описание["TYPE"]);	
			Фильтр.Вставить(Имя, ТипДанных);
		
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Фильтр;
	
КонецФункции

#КонецОбласти

#КонецОбласти

#Область СлужебныйПрограммныйИнтерфейс

Функция НормализоватьАвторизацию(URL, Знач Токен, Знач Метод = "")
    
    OPI_ПреобразованиеТипов.ПолучитьСтроку(URL);
    OPI_ПреобразованиеТипов.ПолучитьСтроку(Токен);
    
    Параметры             = Новый Структура;
    ЭтоАвторизацияТокеном = ЗначениеЗаполнено(Токен);
    
	МассивЛишнихЭлементов = Новый Массив;
	МассивЛишнихЭлементов.Добавить("https://");
	МассивЛишнихЭлементов.Добавить("http://");
	МассивЛишнихЭлементов.Добавить("www.");
	
	Для Каждого УдаляемыйЭлемент Из МассивЛишнихЭлементов Цикл
		URL = СтрЗаменить(URL, УдаляемыйЭлемент, "");
	КонецЦикла;
	
	URL = СокрЛП(URL);
	
	Если Не СтрЗаканчиваетсяНа(URL, "/") Тогда
		URL = URL + "/";
    КонецЕсли;
    
    Если ЭтоАвторизацияТокеном Тогда
        
        Если Не СтрЗаканчиваетсяНа(URL, "rest/") Тогда
    		URL = URL + "rest/";
        КонецЕсли;
        
        Параметры.Вставить("auth", Токен);
        
    КонецЕсли;
	
	Если ЗначениеЗаполнено(Метод) Тогда
		URL = URL + СокрЛП(Метод);
    КонецЕсли;
    
    Возврат Параметры;

КонецФункции

Функция НормализоватьФайлы(Знач Файлы)
    
    НормализованныеФайлы = Новый Массив;

    Если ТипЗнч(Файлы) = Тип("Соответствие") Тогда
        
        Для Каждого Файл Из Файлы Цикл 
            
            ТекущийМассив = Новый Массив;
            ТекущийФайл   = Файл.Значение;
            ТекущееИмя    = Файл.Ключ;
            
            OPI_ПреобразованиеТипов.ПолучитьДвоичныеДанные(ТекущийФайл);
            OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекущееИмя);
            
            ТекущийМассив.Добавить(ТекущееИмя);
            ТекущийМассив.Добавить(Base64Строка(ТекущийФайл));
            
            НормализованныеФайлы.Добавить(ТекущийМассив);
            
        КонецЦикла;
    
    КонецЕсли;
    
    Возврат НормализованныеФайлы;
    
КонецФункции

Процедура ПривестиБулево(Значение)

    OPI_ПреобразованиеТипов.ПолучитьБулево(Значение);
    Значение = ?(Значение, "Y", "N");
    
КонецПроцедуры

Функция УправлениеЗадачей(Знач URL, Знач IDЗадачи, Знач Метод, Знач Токен = "")
    
    Параметры = НормализоватьАвторизацию(URL, Токен, Метод);
    OPI_Инструменты.ДобавитьПоле("taskId", IDЗадачи, "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;
    
КонецФункции

Функция УправлениеФайлом(Знач URL, Знач IDФайла, Знач Метод, Знач Токен = "")

    Параметры = НормализоватьАвторизацию(URL, Токен, Метод);
    OPI_Инструменты.ДобавитьПоле("id", IDФайла, "Строка", Параметры);
    
    Ответ = OPI_Инструменты.Post(URL, Параметры);
    
    Возврат Ответ;	 
    
КонецФункции

#КонецОбласти
